//
// Created by Jisam on 2024/6/20.
//
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;
// Trie树数据结构相关定义和操作
constexpr int N = 1E7; // Trie树的最大节点数量
constexpr int inf = 0x3f3f3f3f; // 表示无穷大的常量

// 全局变量
int tot; // 当前已使用的节点总数
int trie[N][2]; // Trie树节点的孩子指针数组，trie[x][0]表示x节点左孩子的索引，trie[x][1]表示x节点右孩子的索引
int f[N]; // f[x]记录以x节点为根的子树中，最晚加入树中的数字的索引位置，初始化为inf表示无有效值

/**
 * 新建一个节点，并初始化其状态
 * @return 新节点的索引
 */
int newNode() {
    int x = ++tot; // 分配一个新的节点索引
    trie[x][0] = trie[x][1] = 0; // 初始化新节点的左右孩子指针为0
    f[x] = inf; // 初始化f值为无穷大
    return x; // 返回新节点的索引
}

/**
 * 将数字x添加到Trie树中
 * @param x 要添加的数字
 * @param i 数字x在序列中的索引位置，用于更新f值
 */
void add(int x, int i) {
    int p = 1; // 从根节点开始
    for (int j = 29; j >= 0; j--) { // 从最高位到最低位遍历x的每一位
        int bit = x >> j & 1; // 获取x的第j位
        int &q = trie[p][bit]; // 获取或设置当前节点对应bit方向的子节点引用
        if (q == 0) { // 如果子节点不存在
            q = newNode(); // 创建新节点作为子节点
        }
        p = q; // 移动到子节点
        f[p] = min(f[p], i); // 更新f值，记录当前子树中最晚加入的数字的索引
    }
}

/**
 * 在Trie树中查询两个数字a和b的最近公共祖先，并返回其索引位置
 * @param a 第一个数字
 * @param b 第二个数字
 * @return 最近公共祖先的索引位置，如果不存在则返回-1
 */
int query(int a, int b) {
    int ans1 = inf, ans2 = inf; // 初始化答案为无穷大
    int p = 1; // 从根节点开始
    for (int i = 29; i >= 0; i--) { // 从最高位到最低位遍历a和b
        int da = a >> i & 1; // 获取a的第i位
        int db = b >> i & 1; // 获取b的第i位
        // 根据a和b的当前位决定探索哪个子节点，并尝试更新答案
        if (db) {
            ans1 = min(ans1, f[trie[p][da]]);
        } else {
            ans2 = min(ans2, f[trie[p][da ^ 1]]);
        }
        // 移动到下一个节点
        p = trie[p][db ^ da];
    }
    // 在最终节点p上再次检查可能的答案
    ans1 = min(ans1, f[p]);
    ans2 = min(ans2, f[p]);

    // 如果找到有效的公共祖先索引，则返回，否则返回-1
    if (ans1 == inf || ans2 == inf) {
        return -1;
    }
    return max({1, ans1, ans2}); // 确保返回值至少为1，防止负索引
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    f[0] = inf; // 初始化根节点的f值为无穷大

    int n, q; // n为数字数量，q为查询次数
    cin >> n >> q;

    tot = 0; // 初始化已使用节点计数器
    newNode(); // 创建Trie树的根节点
    vector<int> x(n); // 存储输入的数字序列
    for (int i = 0; i < n; i++) {
        cin >> x[i]; // 读取数字
        add(x[i], i); // 将数字及其索引添加到Trie树中
    }
    while (q--) {
        int a, b; // 查询的两个数字
        cin >> a >> b;
        cout << query(a, b) << "\n";
    }
    return 0;
}
